"""密码加解密工具

支持两种形式的数据库密码：
- 明文，例如："Liu123456"
- 密文，以前缀 "ENC:" 开头，例如："ENC:TGl1MTIzNDU2"

当前实现使用 Base64 进行简单可逆“加密”，主要目的是避免明文直接出现在配置文件中，
而不是用来防御高强度攻击。如需更安全方案，可以后续替换实现。
"""

import base64
from typing import Optional

ENCRYPTED_PREFIX = "ENC:"


def encrypt_password(plain: str) -> str:
    """将明文密码加密为带前缀的字符串。

    Args:
        plain: 明文密码

    Returns:
        例如："Liu123456" -> "ENC:TGl1MTIzNDU2"
    """
    if plain is None:
        return ""
    data = str(plain).encode("utf-8")
    encoded = base64.b64encode(data).decode("utf-8")
    return ENCRYPTED_PREFIX + encoded


def is_encrypted(value: Optional[str]) -> bool:
    """判断一个密码字符串是否为加密格式。"""
    return isinstance(value, str) and value.startswith(ENCRYPTED_PREFIX)


def decrypt_password(value: Optional[str]) -> str:
    """解密密码。如果不是加密格式，则原样返回（用于支持明文）。

    Args:
        value: 可能为明文或密文的密码

    Returns:
        明文密码字符串（解密后或原样）
    """
    if not isinstance(value, str) or value == "":
        return ""

    if not value.startswith(ENCRYPTED_PREFIX):
        # 非加密格式，当作明文直接使用
        return value

    encoded = value[len(ENCRYPTED_PREFIX) :]
    try:
        decoded = base64.b64decode(encoded.encode("utf-8")).decode("utf-8")
        return decoded
    except Exception:
        # 解密失败时，为避免连接完全不可用，退回原始值
        return value
